﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace iNet.Media.Imaging.Filters
{
	/// <summary>
	/// 對比濾鏡工作。
	/// </summary>
	public class ContrastFilterTask : SimpleColorTransformFilterTask
	{
		#region 欄位
		double _Contrast;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 ContrastFilterTask 執行個體。
		/// </summary>
		public ContrastFilterTask()
		{ }
		/// <summary>
		/// 初始化新的 ContrastFilterTask 執行個體。
		/// </summary>
		/// <param name="sourceBitmap">來源點陣圖。</param>
		/// <param name="contrast">對比值，範圍為 -1 ~ 1。-1 表示最低對比；1 表示最高對比；0 表示原始對比。</param>
		/// <exception cref="ArgumentOutOfRangeException">contrast 不是 -1 ~ 1 (包含) 之間的值。</exception>
		public ContrastFilterTask(IBitmapImage sourceBitmap, double contrast)
			: base(sourceBitmap)
		{
			if (contrast < -1 || contrast > 1)
				throw new ArgumentOutOfRangeException("contrast");
			_Contrast = contrast;
		}
		#endregion
		#region ApplyFilter
		/// <summary>
		/// 套用濾鏡至點陣圖。
		/// </summary>
		/// <param name="version">工作版本。</param>
		/// <param name="filterData">套用濾鏡所需的資料。</param>
		/// <returns>True 表示濾鏡套用成功或取消，False 表示失敗。</returns>
		protected override bool ApplyFilter(Tasks.TaskVersion version, BitmapImageFilterData filterData)
		{
			//取得參數
			BitmapImageFilterChannels channels = this.Channels;
			double contrast;
			if (!this.ReadValue<double>(version, ref _Contrast, out contrast))
				return true;

			//計算轉換表
			if (Math.Abs(contrast) >= 0.00001)
			{
				//計算轉換表
				int colorCount = (filterData.Is16BitsColor ? 65536 : 256);
				int[] table = ColorTransformTableFactory.CreateLinearContrastTransform(colorCount, contrast);

				//設定轉換表
				if (channels == BitmapImageFilterChannels.Luminance)
					this.LuminanceTransformTable = table;
				else
				{
					this.AlphaTransformTable = table;
					this.RedColorTransformTable = table;
					this.GreenColorTransformTable = table;
					this.BlueColorTransformTable = table;
				}
			}

			//呼叫基底
			return base.ApplyFilter(version, filterData);
		}
		#endregion
		#region Contrast
		/// <summary>
		/// 取得或設定對比值，範圍為 -1 ~ 1。0 表示最低對比；1 表示最高對比；0 表示原始對比，預設值為 0。
		/// </summary>
		public double Contrast
		{
			get
			{
				return _Contrast;
			}
			set
			{
				if (value < -1 || value > 1)
					throw new ArgumentOutOfRangeException();
				this.SetInitializingParameter<double>(ref _Contrast, value);
			}
		}
		#endregion
	}
}
